import javax.swing.*;
import java.io.*;
import java.net.URISyntaxException;
import java.nio.file.Paths;

public class FileUtil {

    /**
     * 选择文件夹并返回路径
     *
     * @return 用户选择的文件夹路径，如果未选择返回 null
     */
    public static String chooseDirectory() {
        JFileChooser directoryChooser = new JFileChooser();
        directoryChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int result = directoryChooser.showOpenDialog(null); // 显示文件夹选择对话框
        if (result == JFileChooser.APPROVE_OPTION) {
            File selectedDirectory = directoryChooser.getSelectedFile();
            return selectedDirectory.getAbsolutePath();
        }
        return null; // 用户取消选择
    }

    /**
     * 选择单个文件并返回 File 对象
     *
     * @return 用户选择的文件对象，如果未选择返回 null
     */
    public static File chooseFile() {
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int result = fileChooser.showOpenDialog(null); // 显示文件选择对话框
        if (result == JFileChooser.APPROVE_OPTION) {
            return fileChooser.getSelectedFile();
        }
        return null; // 用户取消选择
    }

    /**
     * 在当前类路径下创建指定文件
     *
     * @param fileName 文件名
     * @return 创建的文件对象
     * @throws IOException 如果创建文件时发生错误
     */
    public static File createFileInClassPath(String fileName) throws IOException, URISyntaxException {
        // 获取当前类所在的目录
        String classDirectory = Paths.get(FileUtil.class.getProtectionDomain()
                .getCodeSource().getLocation().toURI()).getParent().toString();

        File inputFile = new File(classDirectory + File.separator + fileName);
        if (inputFile.exists()) {
            inputFile.delete();
        }
        inputFile.createNewFile();
        return inputFile;
    }

    /**
     * 使用记事本打开文件
     *
     * @param file 要打开的文件
     * @throws IOException          如果打开文件时发生错误
     * @throws InterruptedException 如果进程被中断
     */
    public static void openFileWithNotepad(File file) throws IOException, InterruptedException {
        String os = System.getProperty("os.name").toLowerCase();

        Process process;
        if (os.contains("win")) {
            process = Runtime.getRuntime().exec("notepad " + file.getPath());
        } else if (os.contains("mac")) {
            process = Runtime.getRuntime().exec("open -a TextEdit " + file.getPath());
        } else {
            process = Runtime.getRuntime().exec("gedit " + file.getPath());
        }

        process.waitFor();
        process.destroy(); // 确保进程结束时释放资源
        System.out.println("线程销毁");
    }
}
